# -*- coding: utf-8 -*-
"""
小红书爬虫配置类
管理爬虫的各种配置参数，包括关键词搜索、目标数据量、请求间隔等
"""


class XHSConfig:
    """
    小红书爬虫配置类
    提供统一的配置管理接口
    """
    
    def __init__(self):
        """
        初始化配置类，设置默认值
        """
        # 搜索关键词列表
        self.KEYWORDS = []
        
        # 目标数据量，达到此数量后停止爬取
        self.TARGET_COUNT = 100
        
        # 请求间隔范围（秒）
        self.REQUEST_INTERVAL_MIN = 2
        self.REQUEST_INTERVAL_MAX = 5
        
        # 搜索页面翻页间隔范围（秒）
        self.SEARCH_PAGE_INTERVAL_MIN = 5
        self.SEARCH_PAGE_INTERVAL_MAX = 10
        
        # 最大重试次数
        self.MAX_RETRY = 3
        
        # 输出格式，支持'csv'或'json'
        self.OUTPUT_FORMAT = 'json'
        
        # 是否启用去重功能
        self.ENABLE_DEDUPLICATION = True
        
        # 去重存储文件路径
        self.DEDUPLICATION_FILE = 'crawled_ids.txt'
        
        # 搜索结果每页数量
        self.SEARCH_PAGE_SIZE = 20
        
        # 最大搜索页数
        self.MAX_SEARCH_PAGES = 50
        
        # 是否保存原始HTML
        self.SAVE_RAW_HTML = False
    
    def set_keywords(self, keywords):
        """
        设置搜索关键词
        
        Args:
            keywords (list or str): 关键词列表或单个关键词
        """
        if isinstance(keywords, str):
            self.KEYWORDS = [keywords]
        else:
            self.KEYWORDS = list(keywords)
    
    def set_target_count(self, count):
        """
        设置目标数据量
        
        Args:
            count (int): 目标爬取的数据条数
        """
        if isinstance(count, int) and count > 0:
            self.TARGET_COUNT = count
        else:
            raise ValueError("目标数据量必须是大于0的整数")
    
    def set_request_interval(self, min_interval, max_interval):
        """
        设置请求间隔范围
        
        Args:
            min_interval (int/float): 最小间隔时间（秒）
            max_interval (int/float): 最大间隔时间（秒）
        """
        if min_interval >= 0 and max_interval > min_interval:
            self.REQUEST_INTERVAL_MIN = min_interval
            self.REQUEST_INTERVAL_MAX = max_interval
        else:
            raise ValueError("请求间隔设置无效，max_interval必须大于min_interval且两者都必须为非负数")
    
    def set_output_format(self, format_type):
        """
        设置输出格式
        
        Args:
            format_type (str): 输出格式，'csv'或'json'
        """
        if format_type.lower() in ['csv', 'json']:
            self.OUTPUT_FORMAT = format_type.lower()
        else:
            raise ValueError("输出格式必须是'csv'或'json'")
    
    def to_dict(self):
        """
        将配置转换为字典格式
        
        Returns:
            dict: 配置字典
        """
        return {
            'KEYWORDS': self.KEYWORDS,
            'TARGET_COUNT': self.TARGET_COUNT,
            'REQUEST_INTERVAL_MIN': self.REQUEST_INTERVAL_MIN,
            'REQUEST_INTERVAL_MAX': self.REQUEST_INTERVAL_MAX,
            'SEARCH_PAGE_INTERVAL_MIN': self.SEARCH_PAGE_INTERVAL_MIN,
            'SEARCH_PAGE_INTERVAL_MAX': self.SEARCH_PAGE_INTERVAL_MAX,
            'MAX_RETRY': self.MAX_RETRY,
            'OUTPUT_FORMAT': self.OUTPUT_FORMAT,
            'ENABLE_DEDUPLICATION': self.ENABLE_DEDUPLICATION,
            'DEDUPLICATION_FILE': self.DEDUPLICATION_FILE,
            'SEARCH_PAGE_SIZE': self.SEARCH_PAGE_SIZE,
            'MAX_SEARCH_PAGES': self.MAX_SEARCH_PAGES,
            'SAVE_RAW_HTML': self.SAVE_RAW_HTML
        }
    
    def from_dict(self, config_dict):
        """
        从字典加载配置
        
        Args:
            config_dict (dict): 配置字典
        """
        for key, value in config_dict.items():
            if hasattr(self, key):
                setattr(self, key, value)
        return self